<?php

namespace app\upload\controller;

class Index
{

    function index()
    {

   
        $uploadDir = 'uploads/zip/';
        $chunkSize = 1024 * 1024 * 5; // 每块的大小（5MB）

// 检查是否上传了文件
        if (isset($_FILES['file']) && isset($_POST['chunk']) && isset($_POST['totalChunks']) && isset($_POST['filename'])) {
            $file = $_FILES['file'];
            $chunkIndex = $_POST['chunk'];  // 当前分块
            $totalChunks = $_POST['totalChunks'];  // 总分块数
            $filename = $_POST['filename'];  // 文件名

            // 文件保存路径
            $filePath = $uploadDir . $filename . '.part' . $chunkIndex;

            // 移动上传的文件块
            if (move_uploaded_file($file['tmp_name'], $filePath)) {
                // 如果是最后一块，开始合并文件
                if ($chunkIndex == $totalChunks - 1) {
                    // 合并文件
                    $uniquePrefix = time() . "_" . mt_rand(1000, 9999) . "_";
                    $finalPath = $uploadDir . $uniquePrefix . $filename;
                    $finalFile = fopen($finalPath, 'ab');  // 以追加模式打开文件

                    for ($i = 0; $i < $totalChunks; $i++) {
                        $partFile = $uploadDir . $filename . '.part' . $i;
                        $partData = file_get_contents($partFile);
                        fwrite($finalFile, $partData);  // 将分块写入最终文件

                        unlink($partFile);  // 删除已合并的块文件
                    }

                  

                    $result = $this->extract($uploadDir . $uniquePrefix . $filename);

                    if ($result) {
                        echo json_encode([ "code"=>200,  'message' => '文件合并完成', 'data' => $result]);
                    } else {
                        echo json_encode([ "code"=>500,  'message' => '文件合并失败', 'data' => $result]);
                    }
                } else {

                    echo json_encode([ "code"=>200,  'message' => '上传成功']);
                }
            } else {
                http_response_code(500);
                echo json_encode([ "code"=>500,  'message' => '上传失败']);
            }
        } else {
            http_response_code(400);
            echo json_encode([ "code"=>400,  'message' => '无效的请求']);
        }

    }

    // 解压文件
    function extract($filePath)
    {
        // ZIP 文件路径
        $zipFilePath = config('path') . $filePath;

        // 确保源ZIP文件存在
        if (!file_exists($zipFilePath)) {
            return false;
        }

        $fileName = pathinfo($filePath, PATHINFO_FILENAME);
  
        // 设置解压目标目录
        $targetDir = config('path') . "auto/";

        // 确保目标目录存在
        if (!is_dir($targetDir)) {
            mkdir($targetDir, 0777, true);
        }

        // 创建唯一的解压目录
        $uniqueId = time() . '_' . mt_rand(1000, 9999);
        $targetDir = $targetDir . $uniqueId;
        
        // 确保解压目录存在
        if (!is_dir($targetDir)) {
            mkdir($targetDir, 0777, true);
        }
        
        // 记录日志
        $logFile = fopen(config('path') . "zip_extract_log.txt", "w");
        fwrite($logFile, "开始解压文件：" . $zipFilePath . "\n");
        fwrite($logFile, "目标目录：" . $targetDir . "\n");
      
        
        // 方法1：尝试使用PHP内置ZipArchive类解压（处理基本文件）
        $success = false;
        
        try {
            $zip = new \ZipArchive();
            if ($zip->open($zipFilePath) === TRUE) {
                // 直接解压到目标目录
                if ($zip->extractTo($targetDir)) {
                    fwrite($logFile, "使用PHP ZipArchive成功解压文件\n");
                    $success = true;
                } else {
                    fwrite($logFile, "PHP ZipArchive解压失败\n");
                }
                $zip->close();
            } else {
                fwrite($logFile, "无法打开ZIP文件\n");
            }
        } catch (\Exception $e) {
            fwrite($logFile, "PHP ZipArchive异常: " . $e->getMessage() . "\n");
        }
        
        // 方法2：如果方法1失败，尝试使用系统unzip命令（对中文支持更好）
        if (!$success) {
            fwrite($logFile, "尝试使用系统unzip命令解压...\n");
            
            // 构建unzip命令
            $escapedZipPath = escapeshellarg($zipFilePath);
            $escapedTargetDir = escapeshellarg($targetDir);
            
            // 使用-O选项指定编码（根据需要可选GB18030、GBK或UTF-8）
            $command = "unzip -O CP936 $escapedZipPath -d $escapedTargetDir";
            
            // 执行命令
            $output = [];
            $result = 0;
            exec($command . " 2>&1", $output, $result);
            
            // 记录输出
            fwrite($logFile, "Unzip命令: $command\n");
            fwrite($logFile, "执行结果: " . ($result === 0 ? "成功" : "失败(代码: $result)") . "\n");
            fwrite($logFile, "输出:\n" . implode("\n", $output) . "\n");
            
            if ($result === 0) {
                $success = true;
            }
        }
        
        // 方法3：最后的备选方案 - 使用7z命令
        if (!$success) {
            fwrite($logFile, "尝试使用7z命令解压...\n");
            
            $escapedZipPath = escapeshellarg($zipFilePath);
            $escapedTargetDir = escapeshellarg($targetDir);
            
            // 7z命令通常处理各种编码情况很好
            $command = "7z x -y $escapedZipPath -o$escapedTargetDir";
            
            // 执行命令
            $output = [];
            $result = 0;
            exec($command . " 2>&1", $output, $result);
            
            // 记录输出
            fwrite($logFile, "7z命令: $command\n");
            fwrite($logFile, "执行结果: " . ($result === 0 ? "成功" : "失败(代码: $result)") . "\n");
            fwrite($logFile, "输出:\n" . implode("\n", $output) . "\n");
        }
        
        fwrite($logFile, "解压过程完成\n");

        // 查找解压后的文件夹
        $extractedFolders = glob($targetDir . "/*", GLOB_ONLYDIR);
        $resultPath = "";
        
        if ($success) {
            if (!empty($extractedFolders)) {
                // 排除 __MACOSX 目录
                foreach ($extractedFolders as $folder) {
                    if (basename($folder) != '__MACOSX') {
                        fwrite($logFile, "找到目录: " . $folder . "\n");
                        // 检查目录是否存在
                        if (is_dir($folder)) {
                            $resultPath = $folder;
                            break;
                        }
                    }
                }
                
                // 如果没有找到合适的目录，则使用整个目标目录
                if (empty($resultPath)) {
                    $resultPath = $targetDir;
                    fwrite($logFile, "未找到合适的子目录，使用目标目录: " . $resultPath . "\n");
                }
            } else {
                $resultPath = $targetDir;
                fwrite($logFile, "未找到任何子目录，使用目标目录: " . $resultPath . "\n");
            }
        }
        
        fwrite($logFile, "最终返回路径: " . $resultPath . "\n");
        fwrite($logFile, "最终验证的路径: " . $resultPath . " (存在: " . (is_dir($resultPath) ? "是" : "否") . ")\n");
        fclose($logFile);
        
        // 确保路径存在且有效
        if ($success && !empty($resultPath)) {
            // 验证路径是否存在
            if (!is_dir($resultPath)) {
                // 文件已关闭，不能再写入日志
                mkdir($resultPath, 0777, true);
            }
            
            // 确保路径有合适的权限
            chmod($resultPath, 0777);
            
            return $resultPath;
        } else {
            // 文件已关闭，不能再写入日志
            return false;
        }
    }


    public function qwq()
    {
        $url = 'https://api.siliconflow.cn/v1/chat/completions';
        $apiKey = 'sk-tiuvcznrtvpmjnipckrwiaotbspbpeslgbxadpwznrfdqocc';
        
        $data = [
            'model' => 'Qwen/QwQ-32B',
            'messages' => [
                [
                    'role' => 'user',
                    'content' => '你好'
                ]
            ],
            'stream' => false,
            'max_tokens' => 4096,
            'thinking_budget' => 4096,
            'min_p' => 0.05,
            'stop' => null,
            'temperature' => 0.7,
            'top_p' => 0.7,
            'top_k' => 50,
            'frequency_penalty' => 0.5,
            'n' => 1,
            'response_format' => [
                'type' => 'text'
            ]
        ];

        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data, JSON_UNESCAPED_UNICODE));
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Authorization: Bearer ' . $apiKey,
            'Content-Type: application/json'
        ]);

        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        
        if (curl_errno($ch)) {
            return ['error' => curl_error($ch)];
        }
        
        curl_close($ch);
        
        $data = json_decode($response, true);
        var_dump($data);
        die();
        return $data;
    }

    public function qwq2()
    {
       phpinfo();
        
    }


}